package Week5.J0516;

public class 二叉树中的最大路径和 {
    int ret = -1010;
    public int maxPathSum (TreeNode root) {
        dfs(root);
        return ret;
    }

    private int dfs(TreeNode root) {
        if (root == null) return 0;
        int l = Math.max(0, dfs(root.left));// 左子树为根的最大单链和
        int r = Math.max(0, dfs(root.right));// 右子树为根的最大单链和
        // 经过root的最大路径和
        ret = Math.max(ret, root.val + l + r);
        // 向上返回最大单链和
        return root.val + Math.max(l, r);
    }
}

class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;
    }
}